package com.zenithsun.news.task.service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import com.syzg.common.util.PKCreator;
import com.zenithsun.common.util.DateUtils;
import com.zenithsun.news.statistics.model.ColumnNewsPV;
import com.zenithsun.news.statistics.model.NewsPV;
import com.zenithsun.news.statistics.service.StatisticsService;

@Service @Lazy(false)
public class NewsPVService {
	static Logger log = LoggerFactory.getLogger(NewsPVService.class);
	
	@Autowired
	private StatisticsService service;
	
	/**###############################################################################**/
	/**表达式举例说明 "   
	    0 0 10,14,16 * * ?  每天上午10点，下午2点，4点
		0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时
		0 0 12 ? *          WED 表示每个星期三中午12点 
		0 0 12 * * ?        每天中午12点触发 
		0 15 10 ? * *       每天上午10:15触发 
		0 15 10 * * ?       每天上午10:15触发 
		0 15 10 * * ? *     每天上午10:15触发 
		0 15 10 * * ? 2005  2005年的每天上午10:15触发 
		0 * 14 * * ?        在每天下午2点到下午2:59期间的每1分钟触发 
		0 0/5 14 * * ?      在每天下午2点到下午2:55期间的每5分钟触发 
		0 0/5 14,18 * * ?   在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 
		0 0-5 14 * * ?      在每天下午2点到下午2:05期间的每1分钟触发 
		0 10,44 14 ? 3 WED  每年三月的星期三的下午2:10和2:44触发 
		0 15 10 ? * MON-FRI 周一至周五的上午10:15触发 
		0 15 10 15 * ?      每月15日上午10:15触发 
		0 15 10 L * ?       每月最后一日的上午10:15触发 
		0 15 10 ? * 6L      每月的最后一个星期五上午10:15触发 
		0 15 10 ? * 6L 2002-2005  2002年至2005年的每月的最后一个星期五上午10:15触发 
		0 15 10 ? * 6#3             每月的第三个星期五上午10:15触发 
    /**###############################################################################**/
	/**
	 * 每日浏览量统计
	 * @throws Exception
	 */
	
	//每天23:54触发
	@Scheduled(cron = "0 54 23 * * ?")
	public void insertNewsPv() throws Exception {
		log.info("TASK:新闻日浏览总量[0 54 23 * * ?]开始执行");
		NewsPV pv = new NewsPV();
		pv.setDay(DateUtils.getCurrentDay());
		pv.setMonth(DateUtils.getCurrentMonth());
		pv.setYear(DateUtils.getCurrentYear());
		// 检查是否已经记录数据
		List<HashMap<String, Object>> map = service.findNewsPV(pv);
		if (map.size() == 0) {
			//初始化浏览量
			int total = 0, total_pic = 0, total_word = 0, totalPV = 0, total_picPV = 0, total_wordPV = 0;
			//查询当前浏览总量
			List<HashMap<String, Object>> list = service.findPVCounter();
			for (HashMap<String, Object> p : list) {
				if (p.get("type").equals("pic")) {
					total_pic = Integer.parseInt(p.get("total").toString());
				} else {
					total_word = Integer.parseInt(p.get("total").toString());
				}
				total = total_pic + total_word;
			}
			// 获取历史浏览量，总浏览量-历史浏览量=当日浏览量
			List<HashMap<String, Object>> listTotal = service.findNewsPVTotal(pv);
			if (listTotal.size() > 0) {
				HashMap<String, Object> old = listTotal.get(0);
				totalPV = Integer.parseInt(old.get("pv") == null ? "0" : old.get("pv").toString());
				total_picPV = Integer.parseInt(old.get("picPv") == null ? "0" : old.get("picPv").toString());
				total_wordPV = Integer.parseInt(old.get("wordPv") == null ? "0" : old.get("wordPv").toString());
			}
			pv.setPv(total - totalPV);
			pv.setPicPv(total_pic - total_picPV);
			pv.setWordPv(total_word - total_wordPV);
			pv.setTime(DateUtils.getCurrentTime());
			//保存当日的新闻浏览量量
			pv.setId(PKCreator.getPk());
			service.saveNewsPV(pv);
		}
	}
	/**
	 * 按column统计日浏览量
	 * 每天23:52触发
	**/
	@Scheduled(cron = "0 52 23 * * ?")
	public void insertColumnNewsPv() throws Exception {
		log.info("TASK:新闻日浏览总量按分类统计[0 54 23 * * ?]开始执行");
		ColumnNewsPV pv = new ColumnNewsPV();
		pv.setYear(DateUtils.getCurrentYear());
		pv.setMonth(DateUtils.getCurrentMonth());
		pv.setDay(DateUtils.getCurrentDay());
		pv.setTime(DateUtils.getCurrentTime());
		List<HashMap<String, Object>> list = service.findColumnPVCounter();
		//获取原来已统计的数量   现总量-原总量=当日总量
		Map<String, String> map = service.findPVTotalGroupColumnId();
		if(map != null){
			for (HashMap<String, Object> o : list) {
				String columnId = o.get("id").toString();
				pv.setColumnId(columnId);
				//检查当日数据是否已经存在
				List<HashMap<String, Object>> listOld = service.findNewsPVTotalByColumnId(pv);
				if(listOld.size() == 0)
				{
					int total_now = Integer.parseInt(o.get("total") == null ? "0" : o.get("total").toString());
					//判断该类型是否统计过，无就获取原总量
					if(map.containsKey(columnId)){
						int total_old = Integer.parseInt(map.get("k_"+columnId));
						pv.setPv(total_now - total_old);
					}else{
						pv.setPv(total_now);
					}
					//保存当日统计量
					pv.setId(PKCreator.getPk());
					service.saveColumnNewsPV(pv);
				}
			}
		}
	}
}
